package mx.unam.ia.algoritmos;

/**
 *
 * @author Juan Fco. Navarrete
 */

import java.util.HashMap;
import java.util.Map;

//Se declaran las operaciones permitidas entre dos elementos: suma, resta, multiplicacion y division
public enum OperacionBinaria
{
    SUMA("+")
    {
        public double ejecutar(double a, double b)
        {
            return a + b;
        }
    },
    RESTA("-")
    {
        public double ejecutar(double a, double b)
        {
            return a - b;
        }
    },
    MULTIPLICACION("*")
    {
        public double ejecutar(double a, double b)
        {
            return a * b;
        }
    },
    DIVISION("/")
    {
        public double ejecutar(double a, double b)
        {
            return a / b;
        }
    };

    //Se hace la relación entre el simbolo de la operacion binaria con su valor asignado. Para poder
    //llamar los valores deseados.
    private String simbolo;
    private static final Map<String,OperacionBinaria> map = new HashMap<String,OperacionBinaria>();

    static
    {
        for (OperacionBinaria operacion : OperacionBinaria.values())
        {
            map.put(operacion.getSimbolo(), operacion);
        }
    }

    private OperacionBinaria(String simbolo) //Se obtiene la operacion binario dependiendo el símbolo.
    {
        this.simbolo = simbolo;
    }

    public String getSimbolo() //Se obtiene el simbolo
    {
        return simbolo;
    }

    public abstract double ejecutar(double a, double b);

    //Se aplica la operacion binaria entre los dos valores dados.
    public static double aplicar(String simbolo, double a, double b)
    {
        OperacionBinaria operacion = map.get(simbolo);
        if(operacion != null)
        {
            return operacion.ejecutar(a,b);
        }
        throw new UnsupportedOperationException("Operacion no valida para el simbolo " + simbolo); //Si no se puede realizar la operacion, se indicará.
    }

    public static boolean esBinaria(String simbolo) // Bandera que indica si se mapea un valor para la llave dada.
    {
        return map.containsKey(simbolo);
    }

    public static String obtenerOperacion() //Se obtiene los valores de la operacion binaria.
    {
        OperacionBinaria[] operaciones = OperacionBinaria.values();
        int aleatorio = (int)(Math.random() * operaciones.length);
        return operaciones[aleatorio].getSimbolo();
    }
}